package com.dongdong.log;

import com.alibaba.fastjson.JSONObject;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
// 声明当前类为切面类
@Aspect
public class LogAspect {
//    1 : 切点表达式   2 : 通知 五大同时(前置通知  ,后置通知 , 返回后通知,环绕通知 ,异常通知)
    public Logger logger = LoggerFactory.getLogger(LogAspect.class);

//    切点表达式
    @Pointcut("execution(* com.dongdong.service.*.*(..))")
    public void  aopLog(){}

//    前置通知
    @Before("aopLog()")
     public void doBefore(JoinPoint joinPoint){
//        打印参数和返回值
        Object[] args = joinPoint.getArgs();//获取每一个被调用的service的方法的参数
        Signature signature = joinPoint.getSignature();
        logger.info("正在执行的方法 : {} 参数为 :{}",signature ,args);
    }

//    后置通知
    @AfterReturning(pointcut = "aopLog()",returning = "roult")
    public void doAfter(Object roult) throws Throwable{
    logger.info("方法执行结束  :  返回值为 {}", JSONObject.toJSONString(roult));
    }
}
